#ifndef THREADPOOL_H
#define THREADPOOL_H

#include <QThreadPool>
#include <QFuture>
#include <functional>

class ThreadPool
{	
public:
	// 单例
	static ThreadPool& instance();

	// max threadCnts
	void setMaxThreadCount(int maxThreadCount);
	int maxThreadCount() const;

	// push word into threadpool
	template<typename Func, typename... Args>
	QFuture<typename std::result_of<Func(Args...)>::type> submitTask(Func&& func, Args&&... args)
    {
        // 封装任务为可调用对象，提交到线程池
        auto task = std::bind(std::forward<Func>(func), std::forward<Args>(args)...);
        return QtConcurrent::run(&m_threadPool, std::move(task));
    }

	// wait task finish
	bool waitForDone(int msecs = -1);		// 等待所有任务完成（超时时间：毫秒，-1表示无限等待）

private:
	ThreadPool();			// 私有构造（禁止外部实例化）
	// 禁止拷贝/赋值
    ThreadPool(const ThreadPool&) = delete;
    ThreadPool& operator=(const ThreadPool&) = delete;

	QThreadPool m_threadPool; // 底层Qt线程池

};

#endif	// THREADPOOL_H